// 使用立即指向函数，不污染全局作用域
export default function () {
  function Waterfall(opt) {
    this.el = opt.el;
    this.oItems = this.el.getElementsByTagName('div');
    this.gap = opt.gap;
    this.column = opt.column;
    this.heightArr = []; //保存每列的高度
    this.itemWidth = (this.el.offsetWidth - (this.column - 1) * this.gap) / this.column;

    this.init(); // 创建时直接调用
  }

  Waterfall.prototype.init = function () {
    this.render(); // 进行渲染
  };

  Waterfall.prototype.render = function () {
    // 思路：先渲染第一行，再依次将后续的图片插入高度最低的列
    let item = null, // 临时保存for循环中当前项
      minIdx = -1; // 保存最低列的索引值

    for (let i = 0; i < this.oItems.length; i++) {
      item = this.oItems[i];
      item.style.width = this.itemWidth + 'px';
      if (i < this.column) {
        item.style.left = (this.itemWidth + this.gap) * i + 'px';
        item.style.top = '0px';
        this.heightArr.push(item.offsetHeight);
      } else {
        minIdx = getMinIdx(this.heightArr); // 取低列的索引值
        item.style.left = this.oItems[minIdx].offsetLeft + 'px'; //使用第一列的数据，减少计算
        item.style.top = this.heightArr[minIdx] + this.gap + 'px';
        this.heightArr[minIdx] += item.offsetHeight + this.gap;
      }
    }
  };

  function getMinIdx(arr) {
    return arr.indexOf(Math.min.apply(null, arr));
  }

  window.Waterfall = Waterfall;
}
